import fs from 'fs'
import MarkdownIt from 'markdown-it'
import { RuleBlock } from 'markdown-it/lib/parser_block'

export default (md: MarkdownIt): void => {
  const parser: RuleBlock = (state, startLine, endLine, silent) => {
    const CH = '<'.charCodeAt(0)
    const pos = state.bMarks[startLine] + state.tShift[startLine]
    const max = state.eMarks[startLine]
    if (state.sCount[startLine] - state.blkIndent >= 4) {
      return false
    }
    for (let i = 0; i < 3; ++i) {
      const ch = state.src.charCodeAt(pos + i)
      if (ch !== CH || pos + i >= max) return false
    }
    if (silent) {
      return true
    }
    const start = pos + 3
    const end = state.skipSpacesBack(max, pos)
    const rawPath = state.src.slice(start, end).trim().replace(/^@/, process.cwd())
    const content = fs.existsSync(rawPath) ? fs.readFileSync(rawPath).toString() : 'Not found: ' + rawPath
    const meta = rawPath.replace(rawPath, '')
    state.line = startLine + 1
    const token = state.push('fence', 'code', 0)
    token.info = rawPath.split('.').pop() + meta
    token.content = content
    token.markup = '```'
    token.map = [startLine, startLine + 1]
    return true
  }
  md.block.ruler.before('fence', 'snippet', parser)
}